﻿namespace Campeonato.Common.Extensions
{
    using System.Data;

    /// <summary>
    /// Classe base para um parâmetro a ser utilizado com o banco de dados.
    /// </summary>
    public abstract class DbParam
    {
        /// <summary>
        /// Tipo do dado no banco de dados.
        /// </summary>
        public abstract DbType DbType { get; }

        /// <summary>
        /// Dados a serem utilizados.
        /// </summary>
        public abstract object Data { protected set; get; }

        /// <summary>
        /// Cria um novo parâmetro com os dados especificados.
        /// </summary>
        /// <typeparam name="T">Tipo dos dados.</typeparam>
        /// <param name="_data">Dados.</param>
        /// <returns>Novo parâmetro.</returns>
        public static DbParam<T> Create<T>(T _data)
        {
            return new DbParam<T>(_data);
        }
    }

    /// <summary>
    /// Versão genérica do DbParam utilizada para obter em tempo de compilação o tipo do dado no banco.
    /// </summary>
    /// <typeparam name="T">Tipo dos dados do parâmetro.</typeparam>
    public class DbParam<T> : DbParam
    {
        private object m_data;
        public override sealed object Data
        {
            protected set { m_data = value; }
            get { return m_data; }
        }

        public override DbType DbType
        {
            get { return DbTypeMapper.GetDbEquivalent<T>(); }
        }

        protected internal DbParam(T _data)
        {
            Data = _data;
        }
    }
}
